# -*- coding: UTF-8 -*-

# 面向对象技术简介
# 类(Class) | 类变量 | 数据成员 | 方法重写 | 局部变量 | 实例变量 | 继承 | 实例化 | 方法 | 对象

# 创建类
print "\n------ 创建类 ------"


class Hello:
    '我的第一个类'
    count = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Hello.count += 1
        print "构造方法执行"

    def displayCount(self):
        print "总共人数为：%s" % Hello.count

    def display(self):
        print "姓名：", self.name, ", 年龄：", self.age


t = Hello("jj", 18)
t.display()
t.displayCount()
t.addre = "aaa"
print t

# 内置类属性
print "\n------ 内置类属性 ------"
print Hello.__doc__
print Hello.__name__
print Hello.__module__
print Hello.__bases__
print Hello.__dict__

# python对象销毁(垃圾回收)
print "\n------ python对象销毁(垃圾回收) ------"


class Point:
    def __init__(self):
        print "对象初始化"

    def __del__(self):
        print "对象销毁"


p = Point()
p2 = p
p3 = p2
print id(p), id(p2), id(p3)
del p
del p2
del p3
# raw_input("aaaa")

# 类的继承
print "\n------ 类的继承 ------"


class Parent:
    def parentM1(self):
        print "我是父类的m1方法"

    def parentM2(self):
        print "我是父类的m2方法"


class Child(Parent):
    def childM1(self):
        print "我是子类的m1方法"


c = Child()
c.parentM1()
c.parentM2()
c.childM1()
print issubclass(Child, Parent)  # 布尔函数判断一个类是另一个类的子类或者子孙类
print isinstance(c, Parent)  # 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true

# 方法重写
print "\n------ 方法重写 ------"


class Animal:
    def zou(self):
        print "动物慢慢的走"


class Dog(Animal):
    __privateAttr = 0
    publicAttr = 0

    def zou(self):
        print "狗疯狂的跑"


d = Dog()
d.zou()
print Dog.publicAttr

# 基础重载方法
print "\n------ 基础重载方法 ------"

# 运算符重载
print "\n------ 运算符重载 ------"


class Add:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __add__(self, other):
        return self.a + other.a, self.b + other.b


a1 = Add(1, 2)
a2 = Add(3, 4)
print a1 + a2

# 类属性与方法
print "\n------ 类属性与方法 ------"


# 类的私有属性
class Run:
    __privateAttr = 0
    publicAttr = 1

    def __privateM1(self):
        print 2

    def publicM2(self):
        print 3

    def getPrivateAttr(self):
        return self.__privateAttr


r = Run()
r.publicM2()
print Run.publicAttr
print r.publicAttr
print r._Run__privateAttr  # 对象._类名__私有属性名
print r.getPrivateAttr()

# 单下划线、双下划线、头尾双下划线说明
# __foo__: 定义的是特殊方法，一般是系统定义名字 ，类似 __init__() 之类的。
# _foo: 以单下划线开头的表示的是 protected 类型的变量，即保护类型只能允许其本身与子类进行访问，不能用于 from module import *
# __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

params = dict({"id": 1}, **{"version": "v5"})

print params
